// rustfmt-wrap_comments: true
// Test attributes and doc comments are preserved.
#![doc(
    html_logo_url = "https://www.rust-lang.org/logos/rust-logo-128x128-blk-v2.png",
    html_favicon_url = "https://doc.rust-lang.org/favicon.ico",
    html_root_url = "https://doc.rust-lang.org/nightly/",
    html_playground_url = "https://play.rust-lang.org/",
    test(attr(deny(warnings)))
)]

//! Doc comment

#![attribute]

//! Crate doc comment

// Comment

// Comment on attribute
#![the(attribute)]

// Another comment

/// Blah blah blah.
/// Blah blah blah.
/// Blah blah blah.
/// Blah blah blah.

/// Blah blah blah.
impl Bar {
    /// Blah blah blooo.
    /// Blah blah blooo.
    /// Blah blah blooo.
    /// Blah blah blooo.
    #[an_attribute]
    #[doc = "an attribute that shouldn't be normalized to a doc comment"]
    fn foo(&mut self) -> isize {}

    /// Blah blah bing.
    /// Blah blah bing.
    /// Blah blah bing.

    /// Blah blah bing.
    /// Blah blah bing.
    /// Blah blah bing.
    pub fn f2(self) {
        (foo, bar)
    }

    #[another_attribute]
    fn f3(self) -> Dog {}

    /// Blah blah bing.

    #[attrib1]
    /// Blah blah bing.
    #[attrib2]
    // Another comment that needs rewrite because it's tooooooooooooooooooooooooooooooo
    // loooooooooooong.
    /// Blah blah bing.
    fn f4(self) -> Cat {}

    // We want spaces around `=`
    #[cfg(feature = "nightly")]
    fn f5(self) -> Monkey {}
}

// #984
struct Foo {
    #[derive(Clone, PartialEq, Debug, Deserialize, Serialize)]
    foo: usize,
}

// #1668

/// Default path (*nix)
#[cfg(all(
    unix,
    not(target_os = "macos"),
    not(target_os = "ios"),
    not(target_os = "android")
))]
fn foo() {
    #[cfg(target_os = "freertos")]
    match port_id {
        'a' | 'A' => GpioPort {
            port_address: GPIO_A,
        },
        'b' | 'B' => GpioPort {
            port_address: GPIO_B,
        },
        _ => panic!(),
    }

    #[cfg_attr(not(target_os = "freertos"), allow(unused_variables))]
    let x = 3;
}

// #1777
#[test]
#[should_panic(expected = "(")]
#[should_panic(expected = /* ( */ "(")]
#[should_panic(/* ((((( */expected /* ((((( */= /* ((((( */ "("/* ((((( */)]
#[should_panic(
    /* (((((((( *//*
    (((((((((()(((((((( */
    expected = "("
    // ((((((((
)]
fn foo() {}

// #1799
fn issue_1799() {
    #[allow(unreachable_code)] // https://github.com/rust-lang/rust/issues/43336
    Some(Err(error));

    #[allow(unreachable_code)]
    // https://github.com/rust-lang/rust/issues/43336
    Some(Err(error));
}

// Formatting inner attributes
fn inner_attributes() {
    #![this_is_an_inner_attribute(foo)]

    foo();
}

impl InnerAttributes() {
    #![this_is_an_inner_attribute(foo)]

    fn foo() {}
}

mod InnerAttributes {
    #![this_is_an_inner_attribute(foo)]
}

fn attributes_on_statements() {
    // Local
    #[attr(on(local))]
    let x = 3;

    // Item
    #[attr(on(item))]
    use foo;

    // Expr
    #[attr(on(expr))]
    {}

    // Semi
    #[attr(on(semi))]
    foo();

    // Mac
    #[attr(on(mac))]
    foo!();
}

// Large derives
#[derive(
    Add, Sub, Mul, Div, Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash, Serialize, Mul,
)]

/// Foo bar baz

#[derive(
    Add,
    Sub,
    Mul,
    Div,
    Clone,
    Copy,
    Eq,
    PartialEq,
    Ord,
    PartialOrd,
    Debug,
    Hash,
    Serialize,
    Deserialize,
)]
pub struct HP(pub u8);

// Long `#[doc = "..."]`
struct A {
    #[doc = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"]
    b: i32,
}

// #2647
#[cfg(
    feature = "this_line_is_101_characters_long_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
)]
pub fn foo() {}

// path attrs
#[clippy::bar]
#[clippy::bar(a, b, c)]
pub fn foo() {}

mod issue_2620 {
    #[derive(Debug, StructOpt)]
    #[structopt(about = "Display information about the character on FF Logs")]
    pub struct Params {
        #[structopt(help = "The server the character is on")]
        server: String,
        #[structopt(help = "The character's first name")]
        first_name: String,
        #[structopt(help = "The character's last name")]
        last_name: String,
        #[structopt(
            short = "j",
            long = "job",
            help = "The job to look at",
            parse(try_from_str)
        )]
        job: Option<Job>,
    }
}

// #2969
#[cfg(not(all(
    feature = "std",
    any(
        target_os = "linux",
        target_os = "android",
        target_os = "netbsd",
        target_os = "dragonfly",
        target_os = "haiku",
        target_os = "emscripten",
        target_os = "solaris",
        target_os = "cloudabi",
        target_os = "macos",
        target_os = "ios",
        target_os = "freebsd",
        target_os = "openbsd",
        target_os = "redox",
        target_os = "fuchsia",
        windows,
        all(target_arch = "wasm32", feature = "stdweb"),
        all(target_arch = "wasm32", feature = "wasm-bindgen"),
    )
)))]
type Os = NoSource;

// #3313
fn stmt_expr_attributes() {
    let foo;
    #[must_use]
    foo = false;
}

// #3509
fn issue3509() {
    match MyEnum {
        MyEnum::Option1 if cfg!(target_os = "windows") =>
        #[cfg(target_os = "windows")]
        {
            1
        }
    }
    match MyEnum {
        MyEnum::Option1 if cfg!(target_os = "windows") =>
        {
            #[cfg(target_os = "windows")]
            1
        }
    }
}
